home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / COMBIOS.C < prev    next >
C/C++ Source or Header  |  1989-07-22  |  5KB  |  178 lines

  1. /* support for serial communication using COMBIOS/MBBIOS/FOSSIL on the IBM-PC */
  2.  
  3. #include <stdio.h>
  4. #include "global.h"
  5. #include "asy.h"
  6. #include "combios.h"
  7. #include "slip.h"
  8. #include "iface.h"
  9.  
  10. struct com com[ASY_MAX];        /* info about the COMBIOS ports */
  11.  
  12. extern unsigned int combios();        /* INT14 access routine */
  13.                     /* args are AX and DX */
  14.  
  15. static char badspeed[] = "Bad speed on COM\n";
  16.  
  17. /* Initialize COM port "dev" */
  18. int
  19. com_init(dev)
  20. int16 dev;
  21. {
  22.     if (com[dev].drtype != 0){    /* port already in use? */
  23.         printf("COM%d: already in use\n",dev + 1);
  24.         return 1;
  25.     }
  26.  
  27.     switch (combios(0x400,dev))    /* Probe driver & INIT (FOSSIL) */
  28.     {
  29.     case 0x1954:            /* FOSSIL */
  30.         com[dev].drtype = 3;    /* remember it is FOSSIL */
  31.         combios(0x0ff0,dev);    /* set flowctrl (off for now) */
  32.         combios(0x1000,dev);    /* ^C/^K checks OFF */
  33.         break;
  34.  
  35.     case 0xaa55:            /* COMBIOS/MBBIOS */
  36.         com[dev].drtype = 2;    /* remember it is MBBIOS */
  37.         combios(0x0901,dev);    /* set options (flow off for now) */
  38.         break;
  39.  
  40.     default:
  41.         com[dev].drtype = 1;    /* unknown type of driver */
  42.         printf("Warning: no COMBIOS/MBBIOS/FOSSIL loaded for COM%d\n",dev + 1);
  43.         break;
  44.     }
  45.  
  46.     if (combios(0x00e3,dev) == 0x00e3) {
  47.         com[dev].drtype = 0;
  48.         printf("No BIOS support for COM%d\n",dev + 1);
  49.         return 1;
  50.     }
  51.     return 0;
  52. }
  53. /* Terminate COM port for "iface" */
  54. int
  55. com_stop(iface)
  56. struct interface *iface;
  57. {
  58.     combios(0x0000,iface->dev);    /* set parameters 00 (=close) */
  59.     if (com[iface->dev].drtype == 3) /* if it is FOSSIL */
  60.         combios(0x0500,iface->dev); /* call it's uninit hook */
  61.     com[iface->dev].drtype = 0;
  62. }
  63. /* Asynchronous line I/O control */
  64. com_ioctl(interface,argc,argv)
  65. struct interface *interface;
  66. int argc;
  67. char *argv[];
  68. {
  69.     if(argc < 2){
  70.         printf("%u %c\n",com[interface->dev].speed,
  71.                  "nxh"[com[interface->dev].mode]);
  72.         return 0;
  73.     }
  74.     return com_speed(interface->dev,atoi(argv[0]),argv[1]);
  75. }
  76. /* Set asynch line speed */
  77. int
  78. com_speed(dev,speed,hands)
  79. int16 dev;
  80. unsigned speed;
  81. char *hands;
  82. {
  83.     unsigned char parm0,parm9;    /* parameters for COMBIOS */
  84.     int i;
  85.     int mode;
  86.  
  87.     for (mode = 2; mode >= 0; mode--)
  88.         if (*hands == "nxh"[mode])
  89.             break;        /* set mode to 0 (none) 1 XON 2 hardw */
  90.  
  91.     switch (com[dev].drtype)    /* action depends on driver type */
  92.     {
  93.     case 1:                /* unknown type, assume standard */
  94.         switch (speed)
  95.         {
  96.         case    300: parm0 = 0x43; break;
  97.         case    600: parm0 = 0x63; break;
  98.         case   1200: parm0 = 0x83; break;
  99.         case   2400: parm0 = 0xa3; break;
  100.         case   4800: parm0 = 0xc3; break;
  101.         case   9600: parm0 = 0xe3; break;
  102.         default:
  103.             printf(badspeed);
  104.             return 1;
  105.         }
  106.  
  107.         combios((unsigned int) parm0,dev);    /* set speed */
  108.         break;
  109.  
  110.     case 2:                /* COMBIOS/MBBIOS */
  111.         switch (speed)
  112.         {
  113.         case    300: parm0 = 0x43; parm9 = 0x00; break;
  114.         case    600: parm0 = 0x63; parm9 = 0x00; break;
  115.         case   1200: parm0 = 0x83; parm9 = 0x00; break;
  116.         case   2400: parm0 = 0xa3; parm9 = 0x00; break;
  117.         case   4800: parm0 = 0xc3; parm9 = 0x00; break;
  118.         case   9600: parm0 = 0xe3; parm9 = 0x00; break;
  119.         case  14400: parm0 = 0x23; parm9 = 0x20; break;
  120.         case  19200: parm0 = 0x43; parm9 = 0x20; break;
  121.         case  28800: parm0 = 0x63; parm9 = 0x20; break;
  122.         case  38400: parm0 = 0x83; parm9 = 0x20; break;
  123.         case  57600: parm0 = 0xa3; parm9 = 0x20; break;
  124.         case 115200: parm0 = 0xc3; parm9 = 0x20; break;
  125.         case 330400: parm0 = 0xe3; parm9 = 0x20; break;
  126.         default:
  127.             printf(badspeed);
  128.             return 1;
  129.         }
  130.  
  131.         combios(0x0901 | parm9 | ((mode == 2)? 4 : 0),dev);
  132.         combios((unsigned int) parm0,dev);
  133.  
  134.         if (com[dev].speed != speed) {        /* speed change? */
  135.             com[dev].txbuf = 0;
  136.             for (i = 0; i < 5; i++) {    /* send some chars */
  137.                 if ((combios(0x0100 | FR_END,dev) & 0xa000) != 0x2000)
  138.                 {            /* timeout or full */
  139.                     com[dev].txbuf = speed / 100;
  140.                     break;        /* store chars for .1 s */
  141.                 }
  142.             }
  143.         }
  144.         break;
  145.  
  146.     case 3:                /* FOSSIL */
  147.         switch (speed)
  148.         {
  149.         case    300: parm0 = 0x43; break;
  150.         case    600: parm0 = 0x63; break;
  151.         case   1200: parm0 = 0x83; break;
  152.         case   2400: parm0 = 0xa3; break;
  153.         case   4800: parm0 = 0xc3; break;
  154.         case   9600: parm0 = 0xe3; break;
  155.         case  19200: parm0 = 0x03; break;
  156.         case  38400: parm0 = 0x23; break;
  157.         default:
  158.             printf(badspeed);
  159.             return 1;
  160.         }
  161.  
  162.         parm9 = 0xf0;            /* calculate handshake parm */
  163.         if (mode == 1)            /* XON/XOFF */
  164.             parm9 |= 9;
  165.         else
  166.             if (mode == 2)        /* hardware (RTS/CTS) */
  167.                 parm9 |= 2;
  168.  
  169.         combios(0xf00 | parm9,dev);    /* set handshake */
  170.         combios((unsigned int) parm0,dev);    /* set speed */
  171.         break;
  172.     }
  173.  
  174.     com[dev].mode = mode;
  175.     com[dev].speed = speed;
  176.     return 0;
  177. }
  178.